package huorong

import (
	"crypto/hmac"
	"crypto/md5"
	"crypto/sha1"
	"encoding/base64"
	"fmt"
	"sort"
	"strings"
	"time"
)

// generateAuthHeader 生成请求的授权头
func generateAuthHeader(secretID, secretKey, method, path string, body []byte, queryParams map[string]string) (string, error) {
	// 1. 计算 body 的 MD5 哈希
	md5Hash := md5.Sum(body)
	contentMD5 := base64.StdEncoding.EncodeToString(md5Hash[:])

	// 2. 处理请求路径
	canonicalizedResource := strings.TrimPrefix(path, "/")

	// 3. 排序查询参数
	var sortedParams []string
	for key, value := range queryParams {
		if key == "{{query_para}}" { // skip query parameters with this key
			continue
		}
		sortedParams = append(sortedParams, fmt.Sprintf("%s=%s", key, value))
	}

	sort.Strings(sortedParams) // 排序参数

	// 拼接查询字符串
	if len(sortedParams) > 0 {
		canonicalizedResource += "?" + strings.Join(sortedParams, "&")
	}

	// 4. 构建待签名的字符串
	expires := time.Now().Unix() + 604800 // 过期时间设置为 7 天
	stringToSign := fmt.Sprintf("%s\n%d\n%s\n%s\n%s", secretID, expires, method, contentMD5, canonicalizedResource)

	// 5. 计算 HMAC-SHA1 签名
	h := hmac.New(sha1.New, []byte(secretKey))
	_, err := h.Write([]byte(stringToSign))
	if err != nil {
		return "", err
	}
	signature := base64.StdEncoding.EncodeToString(h.Sum(nil))

	// 6. 返回 Authorization 和 query 参数
	authHeader := fmt.Sprintf("HRESS%s:%d:%s", secretID, expires, signature)
	//queryPara := fmt.Sprintf("ak=%s&expires=%d&sign=%s", secretKey, expires, signature)

	// 可以选择返回 authHeader 或 queryPara，根据使用场景不同选择合适的
	return authHeader, nil
}
